jjzjj

Java ExecutorService 和 ThreadPoolExecutor

全部标签

java - Java-5 ThreadPoolExecutor 与 Java-7 ForkJoinPool 相比有什么优势?

Java5以Executor框架的形式引入了对线程池异步任务执行的支持,其核心是java.util.concurrent.ThreadPoolExecutor实现的线程池。Java7以java.util.concurrent.ForkJoinPool的形式添加了一个替代线程池。查看它们各自的API,ForkJoinPool在标准场景中提供了ThreadPoolExecutor功能的超集(尽管严格来说ThreadPoolExecutor提供了比ForkJoinPool更多的调优机会)。除此之外,观察到fork/join任务似乎更快(可能是由于工作窃取调度程序),需要的线程肯定更少(由于非

java - Keep-alive 如何与 ThreadPoolExecutor 一起工作?

继续question由我发布,我正在尝试使用ThreadPoolExecutor在我的代码库中。即使在反复尝试从JavaAPI文档中理解之后,我也无法清楚地理解要在构造函数中传递的keepAliveTime参数背后的功能/目的。希望有人可以用一些好的工作示例来解释我。Java文档节选:publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueworkQueue)keepAliveTime-当线程数大于核心时,这是多余空闲线程的最大时间在终

java - ThreadPoolExecutor 在队列满时阻塞?

我正在尝试使用ThreadPoolExecutor执行大量任务。下面是一个假设的例子:defworkQueue=newArrayBlockingQueue(3,false)defthreadPoolExecutor=newThreadPoolExecutor(3,3,1L,TimeUnit.HOURS,workQueue)for(inti=0;i问题是我很快得到一个java.util.concurrent.RejectedExecutionException因为任务的数量超过了工作队列的大小。但是,我正在寻找的期望行为是让主线程阻塞,直到队列中有空间。实现这一目标的最佳方法是什么?

java - Eclipse 调试器总是阻塞在 ThreadPoolExecutor 上,没有任何明显的异常,为什么?

我在Eclipse上处理我的常用项目,它是一个J2EE应用程序,由Spring、Hibernate等组成。我为此使用了Tomcat7(没有特别的原因,我没有利用任何新功能,我只是想尝试一下)。每次我调试我的应用程序时,Eclipse调试器都会像到达断点一样弹出,但事实并非如此,实际上它在ThreadPoolExecutor的Java源文件上停止。控制台上没有堆栈跟踪,它只是停止。然后,如果我单击恢复它会继续,并且该应用程序可以完美运行。这是调试器窗口中显示的内容:DaemonThread["http-bio-8080"-exec-2](Suspended(exceptionRuntim

java - ExecutorService(特别是 ThreadPoolExecutor)线程安全吗?

ExecutorService是否保证线程安全?我将来自不同线程的作业提交到同一个ThreadPoolExecutor,我是否必须在交互/提交任务之前同步对执行器的访问? 最佳答案 (与其他答案相反)线程安全契约(Contract)is记录在案:查看interfacejavadocs(与方法的javadoc相反)。例如,在ExecutorService的底部您找到的javadoc:Memoryconsistencyeffects:ActionsinathreadpriortothesubmissionofaRunnableorCal

java - ExecutorService(特别是 ThreadPoolExecutor)线程安全吗?

ExecutorService是否保证线程安全?我将来自不同线程的作业提交到同一个ThreadPoolExecutor,我是否必须在交互/提交任务之前同步对执行器的访问? 最佳答案 (与其他答案相反)线程安全契约(Contract)is记录在案:查看interfacejavadocs(与方法的javadoc相反)。例如,在ExecutorService的底部您找到的javadoc:Memoryconsistencyeffects:ActionsinathreadpriortothesubmissionofaRunnableorCal

java - ThreadPoolExecutor 的 submit() 方法饱和后如何阻塞?

我想创建一个ThreadPoolExecutor,当它达到最大大小并且队列已满时,submit()方法blocks尝试添加新任务时。我是否需要为此实现自定义RejectedExecutionHandler或者是否有使用标准Java库来执行此操作的现有方法? 最佳答案 我刚刚找到的一种可能的解决方案:publicclassBoundedExecutor{privatefinalExecutorexec;privatefinalSemaphoresemaphore;publicBoundedExecutor(Executorexec,i

java - ThreadPoolExecutor 的 submit() 方法饱和后如何阻塞?

我想创建一个ThreadPoolExecutor,当它达到最大大小并且队列已满时,submit()方法blocks尝试添加新任务时。我是否需要为此实现自定义RejectedExecutionHandler或者是否有使用标准Java库来执行此操作的现有方法? 最佳答案 我刚刚找到的一种可能的解决方案:publicclassBoundedExecutor{privatefinalExecutorexec;privatefinalSemaphoresemaphore;publicBoundedExecutor(Executorexec,i

jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一)

jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一)线程池介绍在日常开发中经常会遇到需要使用其它线程将大量任务异步处理的场景(异步化以及提升系统的吞吐量),而在使用线程的过程中却存在着两个痛点。在java等很多主流语言中每个逻辑上的线程底层都对应着一个系统线程(不考虑虚拟线程的情况)。操作系统创建一个新线程是存在一定开销的,在需要执行大量的异步任务时,如果处理每个任务时都直接向系统申请创建一个线程来执行,并在任务执行完毕后再回收线程,则创建/销毁大量线程的开销将无法忍受。每个系统线程都会占用一定的内存空间,且系统在调度不同线程上下文切换时存在一定的cpu开销

jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一)

jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一)线程池介绍在日常开发中经常会遇到需要使用其它线程将大量任务异步处理的场景(异步化以及提升系统的吞吐量),而在使用线程的过程中却存在着两个痛点。在java等很多主流语言中每个逻辑上的线程底层都对应着一个系统线程(不考虑虚拟线程的情况)。操作系统创建一个新线程是存在一定开销的,在需要执行大量的异步任务时,如果处理每个任务时都直接向系统申请创建一个线程来执行,并在任务执行完毕后再回收线程,则创建/销毁大量线程的开销将无法忍受。每个系统线程都会占用一定的内存空间,且系统在调度不同线程上下文切换时存在一定的cpu开销